package com.liuyan.util;

import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 上传文件处理的工具类
 */
public class FileUploadTools {

    /**
     * <p>
     * 文件上传
     * <p>
     * <p>
     * uploadFiles:
     * <p>
     *
     * @param file
     * @param url
     * @return 路径
     */
    public static String uploadFiles(String url, MultipartFile file)
            throws IllegalStateException, IOException {
        // 取得所有文件名
        // 记录上传过程起始时的时间，用来计算上传时间
        int pre = (int) System.currentTimeMillis();
        // 取得上传文件
        // 大小限制已经处理需要你们做类型的校验
        String path = "/usr/local/etc/qmws/upload/" + url;
        String returnPath = "upload/" + url;
        String fileName = "";
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        DateFormat formatdate = new SimpleDateFormat("yyyy-MM-dd");
        if (file != null) {
            File a = new File(path+"/"+ formatdate.format(date));
            if (!a.isDirectory()) {
                a.mkdirs();
            }
            // 取得当前上传文件的文件名称
            String myFileName = file.getOriginalFilename();
            // 如果名称不为“”,说明该文件存在，否则说明该文件不存在
            if (myFileName.trim() != "") {
                System.out.println(myFileName);
                // 重命名上传后的文件名 保证唯一
                String exeName = file.getOriginalFilename();
                fileName = format.format(date) + (Math.random() * 9000 + 1000)
                        + "." + exeName.substring(exeName.lastIndexOf(".") + 1);
                // 定义上传路径
                path = path + "/"+ formatdate.format(date)+ "/" + fileName;// 需要修改自己的路径
                File localFile = new File(path);
                file.transferTo(localFile);
            }
        }
        // 记录上传该文件后的时间
        int finaltime = (int) System.currentTimeMillis();
        System.out.println(finaltime - pre + " " + returnPath + "/" + fileName);
        return returnPath + "/" + formatdate.format(date) + "/" + fileName;// 按你们的逻辑进行跳转
    }


    /**
     * <p>文件上传到远程服务器<p>
     * <p>uploadFiles:<p>
     *
     * @param file
     * @param url
     * @return 路径
     */
    public static String uploadFilesToYc(String url, MultipartFile file) throws IllegalStateException, IOException {
        //取得所有文件名
        //记录上传过程起始时的时间，用来计算上传时间
        int pre = (int) System.currentTimeMillis();
        //取得上传文件
        //大小限制已经处理需要你们做类型的校验
        String path = "D:/upload/" + url;
        String returnPath = "upload/" + url;
        String fileName = "";
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        DateFormat formatdate = new SimpleDateFormat("yyyy-MM-dd");
        if (file != null) {
            File a = new File(path+"/"+ formatdate.format(date));
            if (!a.isDirectory()) {
                a.mkdirs();
            }
            //取得当前上传文件的文件名称
            String myFileName = file.getOriginalFilename();
            //如果名称不为“”,说明该文件存在，否则说明该文件不存在
            if (myFileName.trim() != "") {
                System.out.println(myFileName);
                //重命名上传后的文件名  保证唯一
                String exeName = file.getOriginalFilename();
                fileName = format.format(date) + (Math.random() * 9000 + 1000) + "." + exeName.substring(exeName.lastIndexOf(".") + 1);
                //定义上传路径
                path = path + "/"+formatdate.format(date)+"/" + fileName;//需要修改自己的路径
                File localFile = new File(path);
                file.transferTo(localFile);
            }
        }
        //记录上传该文件后的时间
        int finaltime = (int) System.currentTimeMillis();
        System.out.println(finaltime - pre + " " + returnPath + "/" + fileName);
        return returnPath + "/"+formatdate.format(date)+"/" + fileName;//按你们的逻辑进行跳转
    }

    /**
     * 将网络图片进行Base64位编码
     *
     * @param imageUrl 图片的url路径，如http://.....xx.jpg
     * @return
     */
    public static String encodeImgageToBase64(URL imageUrl) {// 将图片文件转化为字节数组字符串，并对其进行Base64编码处理
        ByteArrayOutputStream outputStream = null;
        try {
            BufferedImage bufferedImage = ImageIO.read(imageUrl);
            outputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", outputStream);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(outputStream.toByteArray());// 返回Base64编码过的字节数组字符串
    }

    /**
     * 将本地图片进行Base64位编码
     *
     * @param imageFile 图片的url路径，如http://.....xx.jpg
     * @return
     */
    public static String encodeImgageToBase64(File imageFile) {// 将图片文件转化为字节数组字符串，并对其进行Base64编码处理
        ByteArrayOutputStream outputStream = null;
        try {
            BufferedImage bufferedImage = ImageIO.read(imageFile);
            outputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", outputStream);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        String base64S = encoder.encode(outputStream.toByteArray());
        return base64S;// 返回Base64编码过的字节数组字符串
    }

    /**
     * 将Base64位编码的图片进行解码，并保存到指定目录
     *
     * @param base64 base64编码的图片信息
     * @return
     */
    public static String decodeBase64ToImage(String base64, String url,
                                           String imgName,String type,String urlpath) {
        String path = urlpath+url;//"D:/upload/" + url;
        String returnPath = "upload/" + url;
        String fileName = imgName;
        BASE64Decoder decoder = new BASE64Decoder();
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        DateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
        try {
            File a = new File(path+"/"+ formatDate.format(date));
            if (!a.isDirectory()) {
                a.mkdirs();
            }
            // 重命名上传后的文件名 保证唯一
            String exeName = type;
            fileName = format.format(date) + (Math.random() * 9000 + 1000)
                    + "." + exeName.substring(exeName.lastIndexOf(".") + 1);
            // 定义上传路径
            path = path + "/"+ formatDate.format(date) + "/" + fileName;// 需要修改自己的路径

            OutputStream write = new FileOutputStream(new File(path));
            base64 = base64.substring(base64.indexOf("base64,")+7);
        byte[] decoderBytes = decoder.decodeBuffer(base64);
            write.write(decoderBytes);
            write.flush();
            write.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return returnPath + "/" + formatDate.format(date) + "/" + fileName;
    }


}
